import time#导入时间模块
#导入自动化模块
from DrissionPage import ChromiumPage
#导入自动化模块，动作链方法
#from DrissionPage.common import Actions
#导入csv模块
import csv
#导入正则表达式模块，用于提取商品ID
import re

def crawl_jd_comments(url):
    #从URL中提取商品ID
    product_id = re.search(r'item\.jd\.com/(\d+)\.html', url).group(1)
    print(f"开始爬取商品ID: {product_id}")
    
    #创建文件对象，添加BOM头解决Excel乱码问题
    f = open(f'data_{product_id}.csv', mode='w', encoding='utf-8-sig', newline='')
    #字典写入方法
    csv_writer = csv.DictWriter(f, fieldnames=[
        '昵称',
        '评分',
        '产品',
        '评论',
        '日期'
    ])
    #写入表头
    csv_writer.writeheader()
    
    #打开浏览器
    dp = ChromiumPage()
    
    try:
        #访问网站
        dp.get(url)
        #监听数据
        dp.listen.start('client.action')
        
        #点击加载全部评论
        try:
            dp.ele('css:.all-btn .arrow').click()  #这里css选择器后面的空格不要删除，不然会报错
        except:
            print(f"商品 {product_id} 没有找到'加载全部评论'按钮，可能页面结构不同")
        
        #构建循环
        for page in range(1, 1001):
            print(f'正在采集商品 {product_id} 的第 {page} 页评论数据')
            
            #等待数据包加载
            try:
                r = dp.listen.wait(timeout=10)
                #获取响应数据
                json_data = r.response.body
                
                #解析数据,获取到的数据返回是一个字典
                #字典取值，提取评论数据所在的列表
                comment_list = json_data['result']['floors'][2]['data']
                
                #如果没有评论数据，退出循环
                if not comment_list:
                    print(f"商品 {product_id} 第 {page} 页没有更多评论")
                    break
                
                for index in comment_list:
                    """提取具体每条评论信息"""
                    try:
                        #判断commentInfo这个键是否存在
                        if 'commentInfo' in [i for i in index.keys()]:
                            dit = {
                                '昵称': index['commentInfo']['userNickName'],
                                '评分': index['commentInfo']['commentScore'],
                                '产品': index['commentInfo']['productSpecifications'].replace('已购', ''),
                                '评论': index['commentInfo']['commentData'],
                                '日期': index['commentInfo']['commentDate']
                            }
                            #写入数据
                            csv_writer.writerow(dit)
                            print(dit)
                        else:
                            pass
                    except Exception as e:
                        print(f"处理评论时出错: {e}")
                
                #定位评论窗口标签位置并滚动到底部
                try:
                    tab = dp.ele('xpath://*[@id="rateList"]/div/div[3]')
                    tab.scroll.to_bottom()
                except:
                    print(f"商品 {product_id} 滚动到底部失败")
                    
                #添加延时，避免请求过快
                time.sleep(1)
                
            except Exception as e:
                print(f"商品 {product_id} 第 {page} 页爬取失败: {e}")
                break
    
    finally:
        #关闭文件和浏览器
        f.close()
        dp.quit()
        print(f"商品 {product_id} 爬取完成")

#要爬取的URL列表
urls = [
    'https://item.jd.com/100066192741.html',
    'https://item.jd.com/100022746195.html'
]

#遍历URL列表进行爬取
for url in urls:
    crawl_jd_comments(url)
